package org.example.mcp.server;

import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.ChatCompletion;
import com.openai.models.ChatCompletionCreateParams;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @author liyshan
 * 2025/05/07/上午9:31
 */
@Slf4j
@Service
public class ToolServer {
    @Tool(description = "批量生成标题")
    public List<String> BatchGenerateTitles(String title) {
        String SystemPrompt = "# 角色\n" +
            "你是一位专业的批量生成标题助手，擅长根据用户提供的提示快速生成高质量的标题。\n" +
            "\n" +
            "## 技能\n" +
            "### 技能1：理解用户需求\n" +
            "- 仔细阅读并理解用户提供的提示和要求。\n" +
            "- 根据用户的输入，确定标题的主题、风格和目标受众。\n" +
            "\n" +
            "### 技能2：创意标题生成\n" +
            "- 能够在短时间内生成多个具有吸引力和多样性的标题。\n" +
            "- 确保每个标题都符合用户的需求，并且能够吸引目标受众的注意力。\n" +
            "\n" +
            "### 技能3：标题优化\n" +
            "- 对生成的标题进行优化，确保它们简洁明了、易于理解。\n" +
            "- 考虑到SEO优化，合理嵌入关键词以提高标题的可发现性。\n" +
            "\n" +
            "### 技能4：多样化风格\n" +
            "- 能够生成不同风格的标题，如新闻报道式、故事叙述式、疑问式等。\n" +
            "- 根据不同的使用场景（如博客文章、社交媒体帖子、新闻报道等）调整标题的风格和长度。\n" +
            "\n" +
            "## 限制\n" +
            "- 生成的标题数量为20个。\n" +
            "- 每个标题应简洁明了，不超过20个字。\n" +
            "- 所有标题必须与用户提供的提示和要求一致。\n" +
            "- 避免使用过于复杂或难以理解的语言。\n" +
            "- 如果需要特定领域的专业知识，可以通过调用搜索工具或查询知识库来获取相关信息。";
        String UserPrompt = "用户输入内容如下："+title;
        String reTitle = null;
        try{
            reTitle = callWithMessage(SystemPrompt,UserPrompt);
            log.info("reTitle:"+reTitle);
        }catch (Exception e){
            return List.of("错误："+e.getMessage());
        }
        if (reTitle == null){
            return List.of("错误：生成标题失败");
        }
        return List.of(reTitle);
    }
    @Tool(description = "文章润色")
    public List<String> polishTheArticle(String content) {
        String SystemPrompt = "你是一位专业的文章润色助手，擅长提升文章的语言表达、逻辑结构和整体流畅性。你的任务是根据用户提供的原始文本，进行细致的润色，使文章更加清晰、生动和有说服力。\n" +
            "\n" +
            "## 技能\n" +
            "### 技能 1: 语言润色\n" +
            "- 优化文章中的词汇选择，使其更加精准和生动。\n" +
            "- 调整句子结构，使文章更加流畅自然。\n" +
            "- 修正语法错误和拼写错误，确保文章的专业性和准确性。\n" +
            "\n" +
            "### 技能 2: 逻辑结构优化\n" +
            "- 重新组织段落顺序，使文章的逻辑更加清晰。\n" +
            "- 添加或删除内容，以增强文章的连贯性和一致性。\n" +
            "- 提供适当的过渡句，使各部分之间的衔接更加自然。\n" +
            "\n" +
            "### 技能 3: 内容丰富与精简\n" +
            "- 根据需要添加更多细节，使文章内容更加丰富和具体。\n" +
            "- 删除冗余信息，使文章更加简洁明了。\n" +
            "- 保持文章的主题和核心思想不变，同时提升其吸引力和可读性。\n" +
            "\n" +
            "### 技能 4: 风格调整\n" +
            "- 根据用户的指示调整文章的风格，如正式、幽默、轻松等。\n" +
            "- 确保文章的风格与目标受众相匹配。\n" +
            "- 保持一致的语气和语调，增强文章的整体效果。\n" +
            "\n" +
            "## 限制\n" +
            "- 只对用户提供的一篇文章进行润色，不涉及其他文档。\n" +
            "- 润色过程中保持原文的核心内容和意图不变。\n" +
            "- 不得添加或删除与文章主题无关的内容。\n" +
            "- 如果用户提供了特定的风格要求，请严格遵循这些要求进行润色。\n" +
            "- 在润色时，注意保留用户的个人风格和声音，避免过度修改。";
        String UserPrompt = "原始文本内容如下："+content;
        String ReContent = null;
        try{
            ReContent = callWithMessage(SystemPrompt,UserPrompt);
            log.info("润色结果："+ReContent);
        }catch (Exception e){
            return List.of("错误："+e.getMessage());
        }
        if (ReContent == null){
            return List.of("错误：文章润色失败");
        }
        return List.of(ReContent);
    }
    @Tool(description = "生成文章")
    public String generateAndSaveArticleByTopic(String topic) {
        // 1. 生成标题
        List<String> titles = BatchGenerateTitles(topic);
        String title;
        if (titles.isEmpty() || titles.get(0).startsWith("错误")) {
            title = "未能生成标题";
        } else {
            String allTitles = titles.get(0);
            String[] titleArr = allTitles.split("[\n;；]");
            title = titleArr.length > 0 ? titleArr[0].trim() : allTitles.trim();
        }
        // 2. 生成初稿文章
        String draft = "《" + title + "》\n" +
                "本文围绕" + topic + "展开，深入探讨其相关内容。" +
                "本文将从背景、现状、挑战与前景等方面进行分析，旨在为读者提供有价值的参考。";
        // 3. 润色文章
        List<String> polished = polishTheArticle(draft);
        String polishedContent = polished.isEmpty() ? "润色失败" : polished.get(0);
        // 4. 保存为txt文件
        String dirPath = "./mcp";
        java.io.File dir = new java.io.File(dirPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 文件名用标题，去除特殊字符
        String fileName = title.replaceAll("[\\\\/:*?\"<>|]", "_") + ".txt";
        java.io.File file = new java.io.File(dir, fileName);
        try (java.io.FileWriter writer = new java.io.FileWriter(file)) {
            writer.write(polishedContent);
        } catch (Exception e) {
            return "保存文件失败：" + e.getMessage();
        }
        return "保存成功，文件路径：" + file.getAbsolutePath();
    }
    private String callWithMessage(String SystemPrompt, String UserPrompt) throws Exception {
        OpenAIClient client = OpenAIOkHttpClient.builder()
            .apiKey("sk-252ca5e1230647fd9b47fd002423ba35")
            .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
            .build();
        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
            .addSystemMessage(SystemPrompt)
            .addUserMessage(UserPrompt)
            .model("qwen-plus")
            .build();
        ChatCompletion chatCompletion = client.chat().completions().create(params);
        return chatCompletion.choices().get(0).message().content().orElse("无返回内容");
    }
}